package demo.cfg;

import org.springframework.boot.actuate.endpoint.annotation.DeleteOperation;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.Selector;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 创建一个 Actuator 端点，用于在应用中查询、启用和禁用 Feature：
 */
@Component
@Endpoint(id = "features")// @Endpoint ：定义一个监控端点，同时支持 HTTP 和 JMX 两种方式。
public class FeaturesEndpoint {

    private Map<String, Feature> features = new ConcurrentHashMap<>();

    // @ReadOperation ：作用在方法上，可用来返回端点展示的信息（通过 Get 方法请求）。
    @ReadOperation
    public Map<String, Feature> features() {
        return features;
    }

    @ReadOperation
    public Feature feature(@Selector String name) {
        return features.get(name);
    }

    // @WriteOperation ：作用在方法上，可用来修改端点展示的信息（通过 Post 方法请求）。
    @WriteOperation
    public void configureFeature(@Selector String name, Feature feature) {
        features.put(name, feature);
    }

    // @DeleteOperation ：作用在方法上，可用来删除对应端点信息（通过 Delete 方法请求）。
    @DeleteOperation
    public void deleteFeature(@Selector String name) {
        features.remove(name);
    }

    //    @Selector ：作用在参数上，用来定位一个端点的具体指标路由。
    public static class Feature {
        private Boolean enabled;

        // get / set 方法
    }

}
